/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package clusteranalyst2;

import Acquaintance.IACluster;
import Control.CCache;
import Entity.EClusterResult;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 *
 * @author Administrator
 */
public class MinDistance
{
     public int hmRow=-1;//哈希表中最小值的key1值
     public int hmCol=-1;//哈希表最小值的key2值
     public int arrRow=-1;//数组中最小值行的索引值
     public int arrCol=-1;//数组中最小值列的索引值
     public int arrRowIndex=0;//记录所形成的数组行的索引值
     public double minDistance=Double.POSITIVE_INFINITY; //整个数组中的最小值


     public void findMinDistance(HashMap distanceMatrix)
    {
       // 遍历矩阵，选取第一个非零的数作为初始最小值
       Set entry2=distanceMatrix.entrySet();
       Iterator it3=entry2.iterator();
       
       while(it3.hasNext())
       {
           Map.Entry me=(Map.Entry)it3.next();
           double [] da=(double[])(me.getValue());
           if(da[0]!=0)
           {
               //找到第一个不为0的数作为最小值
               minDistance=da[0];
               break;
           }
           else
           {
               continue;
           }
        }
        //开始找最小值所在的行列号
       Set entry=distanceMatrix.entrySet();
       Iterator it=entry.iterator();

       int arrayLen=0;//用后  删除

       while(it.hasNext())
       {
           Map.Entry me=(Map.Entry)it.next();
           double [] a=(double[])(me.getValue());
           int keyNum=Integer.parseInt(me.getKey().toString());//得到行号，直接是哈希表的key值
           for(int i=0;i<a.length;i++)
           {
               if(arrRowIndex<i)//非对角元的数值
               {
                   if(a[i]<=minDistance)
                   {
                       minDistance=a[i];
                       //得到数组中最小值的索引
                       hmRow=keyNum;
                       //hmCol=i;
                       arrRow=arrRowIndex;
                       arrCol=i;
                   }
               }
               else
               {
                   continue;
               }
           }          
           arrRowIndex++;
           arrayLen=a.length;
       }
        //System.out.println("最小值的arrCol："+arrCol+"   minDistance:"+minDistance);
       //得到哈希表索引键值得列表
       Set keys=distanceMatrix.keySet();
       Object[] keyArray=keys.toArray();
       //将索引值转换成KEY值
       hmCol=Integer.parseInt(keyArray[arrCol].toString());//将数组索引值转换成哈希表的关键字值
       //System.out.println("******************************arrCol"+arrCol+";hmCol"+hmCol+";keyArray size"+keyArray.length+";hm.size"+distanceMatrix.size());
       //System.out.println("当Y="+minDistance+"时，G"+hmRow+"和G"+hmCol+"归为一类"+"，即G"+GlobalVar.currentClassNum+"={"+"G"+hmRow+",G"+hmCol+"}");
      //System.out.println("***********array.lenth"+arrayLen);
      //////////////////////////////插入数据库/////////////////////////////////
      IACluster ecr = (IACluster) new EClusterResult(GlobalVar.currentClassNum, minDistance, hmRow, hmCol);
      CCache.getCache().registerChilden(ecr);
      CCache.getCache().registerParent(ecr);
    
     }

}
